#include "util.hpp"

class ServerTcp
{
public:
    ServerTcp(uint16_t port, const std::string &ip = "") : port_(port), ip_(ip), sock_(-1)
    {
    }
    ~ServerTcp()
    {
    }

public:
    void init()
    {
        // 1. 创建socket
        sock_ = socket(PF_INET, SOCK_STREAM, 0);
        if (sock_ < 0)
        {
            logMessage(FATAL, "socket: %s", strerror(errno));
            exit(SOCKET_ERR);
        }
        logMessage(DEBUG, "socket: %s,  sock_: %d", strerror(errno), sock_);

        // 2. bind绑定
        // 2.1 填充服务器信息
        struct sockaddr_in local; // 用户栈
        memset(&local, 0, sizeof local);
        local.sin_family = PF_INET;      //进行网络通信
        local.sin_port = htons(port_);
        ip_.empty() ? (local.sin_addr.s_addr = INADDR_ANY) : (inet_aton(ip_.c_str(), &local.sin_addr));
        // 2.2 本地socket信息，写入sock_对应的内核区域
        if (bind(sock_, (const struct sockaddr *)&local, sizeof local) < 0)
        {
            logMessage(FATAL, "bind: %s", strerror(errno));
            exit(BIND_ERR);
        }
        logMessage(DEBUG, "bind: %s,  sock_: %d", strerror(errno), sock_);

        // 3. 监听socket，为何要监听呢？tcp是面向连接的！
        if (listen(sock_, 5 /*后面再说*/) < 0)
        {
            logMessage(FATAL, "listen: %s", strerror(errno));
            exit(LISTEN_ERR);
        }
        logMessage(DEBUG, "listen: %s,  sock_: %d", strerror(errno), sock_);
        // 允许别人来连接你了
    }
    void loop()
    {
        while (true)
        {
            // 4. 获取连接, accept 的返回值是一个新的socket fd ？？

            logMessage(DEBUG, "server 提供 service start ...");
            sleep(1);
        }
    }

private:
    // sock
    int sock_;
    // port
    uint16_t port_;
    // ip
    std::string ip_;
};

int main()
{
    ServerTcp svr(8080);
    svr.init();
    svr.loop();
    return 0;
}